package com.xiaoma.pattern.proxy.cglib;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;


public class CglibMeipo implements MethodInterceptor {

    /**
     * https://blog.csdn.net/rain097790/article/details/14168785
     * 获取代理对象
     * @author xiaomacdut
     * @param clazz 被代理的类
     * @return
     * @throws Exception
     * @version 0.0.1
     * @since 0.0.1
     * @data 2018年11月25日 下午7:37:13
     */
    public Object getInstance(Class<?> clazz){
        //查看生成的代理类字节码
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\cglib");
        //相当于Proxy，代理的工具类
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);// 设置代理对象的父类
        enhancer.setCallback(this);// 回调函数 拦截器
        return enhancer.create();
        
    }
    

    /**
     * 类似invokerhanddler的invoke方法
     * @param o 生成的子类
     * @param method
     * @param objects
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object [] objects, MethodProxy methodProxy) throws Throwable{
        // 业务的增强
        System.out.println("我是媒婆：我要给你找对象，现在已经拿到你的需求");
        System.out.println("开始物色");
        //从名字看是调用父类，被代理的类是父类
        methodProxy.invokeSuper(o, objects);
        
        System.out.println("如果合适的话，就准备办事");
        return null;
    }

}
